import {isNone} from '@/common'
import {isEmptyStr} from '@/str'


/**
 * 根据对象生成 url 查询参数字符串
 *
 * @param {Record<string, any>} obj 对象类型的查询参数，对于名称为空（包括 undefined、null、空字符串）的项，将被忽略
 * @param {boolean} isQuestionMark 是否需要在生成的 url 查询参数字符串前面加 `?`
 * @returns {string} 生成的 url 查询参数字符串
 */
export const genUrlQueryStrByObj = (obj: Record<string, any>, isQuestionMark: boolean = false): string => {
  // 保存生成的 url 查询参数字符串
  let urlQueryStr = ''
  // 处理到对象中第几个属性
  let objPropCnt = 0
  // 生成 url 查询参数字符串
  for (const key in obj) {
    // 对于 Query 参数名称为空的项，跳过
    if (isNone(key) || isEmptyStr(key)) continue
    objPropCnt++
    // 如果是第一个查询参数，且需要生成 `?`
    if (objPropCnt === 1 && isQuestionMark) urlQueryStr += "?"
    else urlQueryStr += "&"
    urlQueryStr += `${key}=${obj[key]}`
  }
  return urlQueryStr
}


/**
 * 根据对象生成 url 中的查询参数字符串，并将其拼接到 url 后面
 *
 * @param {string} url 需要拼接查询参数字符串的 url
 * @param {Record<string, any>} obj 对象类型的查询参数，对于名称为空（包括 undefined、null、空字符串）的项，将被忽略
 * @returns {string} 拼接好查询参数字符串的 url
 */
export const genUrlByObj = (url: string, obj: Record<string, any>): string => {
  return url + genUrlQueryStrByObj(obj, true)
}


/**
 * 根据 Query 参数名称和值组成的数组列表生成 url 查询参数字符串
 *
 * @param {Array<[string, any]>} arrList Query 参数名称和值组成的数组列表，对于查询参数名称为空（包括 undefined、null、空字符串）的
 * 项，将被忽略
 * @param {boolean} isQuestionMark 是否需要在生成的 url 查询参数字符串前面加 `?`
 * @returns {string} 生成的 url 查询参数字符串
 */
export const genUrlQueryStrByArrList = (arrList: Array<[string, any]>, isQuestionMark: boolean = false): string => {
  // 保存生成的 url 查询参数字符串
  let urlQueryStr = ''
  // 处理到第几个 Query 参数数组
  let queryArrCnt = 0
  // 生成 url 查询参数字符串
  for (const queryArr of arrList) {
    // 对于 Query 参数名称为空的项，跳过
    if (isNone(queryArr[0]) || isEmptyStr(queryArr[0])) continue
    queryArrCnt++
    // 如果是第一个查询参数，且需要生成 `?`
    if (queryArrCnt === 1 && isQuestionMark) urlQueryStr += "?"
    else urlQueryStr += "&"
    urlQueryStr += `${queryArr[0]}=${queryArr[1]}`
  }
  return urlQueryStr
}


/**
 * 根据 Query 参数名称和值组成的数组列表生成 url 中的查询参数字符串，并将其拼接到 url 后面
 *
 * @param {string} url 需要拼接查询参数字符串的 url
 * @param {Array<[string, any]>} arrList Query 参数名称和值组成的数组列表，对于查询参数名称为空（包括 undefined、null、空字符串）的
 * 项，将被忽略
 * @returns {string} 拼接好查询参数字符串的 url
 */
export const genUrlQueryByArrList = (url: string, arrList: Array<[string, any]>) => {
  return url + genUrlQueryStrByArrList(arrList, true)
}
